/* 
    javaScript和Ｃ＋＋不一样，并没有类，在javaScript中，构造函数只是使用new操作符时被调用的函数，这些函数和普通的函数并没有什么不同，
    它不属于某个类，也不可能实例化出一个类。任何一个函数都可以使用new来调用，因此其实并不存在构造函数，而只有对于函数的“构造调用”。

    使用new来调用函数，会自动执行下面的操作：
        
        创建一个空对象，构造函数中的this指向这个空对象
        这个新对象被执行 [[原型]] 连接
        执行构造函数方法，属性和方法被添加到this引用的对象中
        如果构造函数中没有返回其它对象，那么返回this，即创建的这个的新对象，否则，返回构造函数中返回的对象。
 */

function _new() {
    let target = {}; //创建的新对象

    //第一个参数是构造函数
    let [constructor, ...args] = [...arguments]; // constructor 就是常说的构造函数

    //执行[[原型]]连接;target 是 constructor 的实例
    target.__proto__ = constructor.prototype;

    //执行构造函数，将属性或方法添加到创建的空对象上
    let result = constructor.apply(target, args);


    if (result && (typeof (result) == "object" || typeof (result) == "function")) {
        //如果构造函数执行的结构返回的是一个对象，那么返回这个对象
        return result;
    }
    
    //如果构造函数返回的不是一个对象，返回创建的新对象
    return target;
}

function sayHi(name) {
    this.name = name;
}
var Hi = new sayHi('Yevtte');
console.log('Hello,', Hi.name);